home *** CD-ROM | disk | FTP | other *** search
/ Linux Cubed Series 3: Developer Tools / Linux Cubed Series 3 - Developer Tools.iso / devel / lang / c / c-bat-0.1n / c-bat-0 / c-bat-0.1 / src / brs_cleanup.c < prev    next >
Encoding:
C/C++ Source or Header  |  1994-06-16  |  2.7 KB  |  108 lines

  1. /*
  2.     cleanup  : Browsing an Analysis Tool for C-source code;
  3.            Clean up after a system crash
  4.  
  5.     Copyright (C) 1993  Eckehard Stolz
  6.  
  7.     This program is free software; you can redistribute it and/or modify
  8.     it under the terms of the GNU General Public License as published by
  9.     the Free Software Foundation (version 2 of the License).
  10.  
  11.     This program is distributed in the hope that it will be useful,
  12.     but WITHOUT ANY WARRANTY; without even the implied warranty of
  13.     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  14.     GNU General Public License for more details.
  15.  
  16.     You should have received a copy of the GNU General Public License
  17.     along with this program; if not, write to the Free Software
  18.     Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
  19.  */
  20.  
  21.  
  22.  
  23. #include <stdio.h>
  24. #include <stdlib.h>
  25. #include <string.h>
  26. #include <malloc.h>
  27. #include <sys/stat.h>
  28. #include <unistd.h>
  29. #include <errno.h>
  30. #include <sys/ipc.h>
  31. #include <sys/msg.h>
  32.  
  33. #include "hash.h"
  34. #include "c-bat.h"
  35. #include "clients.h"
  36.  
  37.  
  38. struct msgform {
  39.   long mtype;
  40.   char mtext[INTRFACE_BUFSIZE];
  41. };
  42.  
  43. static struct msgform  Msg; /* message buffer */
  44.  
  45. static key_t  key = DEFAULT_KEY;
  46. static int  msqid;
  47.  
  48.  
  49. main( int argc, char *argv[] )
  50. { int  server, ret;
  51.   short  code,
  52.          static_flag;
  53.   long   line,
  54.          m_id;
  55.    
  56.   short  cmd, flag;
  57.   int    pid, mtype, cnt, m_char;
  58.   char   buffer[80];
  59.  
  60.   if ((msqid = msgget (key, 0777)) == -1) 
  61.     { switch( errno )
  62.         { case ENOENT: /* message queue does not exist. Nothing to do */
  63.           case EIDRM:  /* message queue has allready been removed     */
  64.                break;
  65.                
  66.           default:
  67.              printf("Error msgget: (errno %d, %s)\n", errno, strerror(errno) );
  68.              break;
  69.          }
  70.     }
  71.    
  72.   pid = 0;
  73.   cmd = CMD_TERMINATE;
  74.   flag = 0;
  75.       
  76.   for( server = MASTER_ID; server <= MAX_SERVERS;  server++ )
  77.    { printf( "Send Termination request to Server %d\n", server );
  78.  
  79.      /* we have to do it by hand, because the termination of the last
  80.         server removes the ipc-ressource. This would cause an exit
  81.         by brs_send_cmd
  82.       */
  83.       
  84.      Msg.mtype = server;
  85.      memcpy( Msg.mtext,     &cmd, sizeof(short) );
  86.      memcpy( Msg.mtext + 2, &flag, sizeof(short) );
  87.      memcpy( Msg.mtext + 4, &pid , sizeof(int) );
  88.          
  89.      if( msgsnd( msqid, (struct msgbuf *) &Msg, 8, IPC_NOWAIT ) == -1 )
  90.         break;
  91.       
  92.      sleep(1);
  93.     }
  94.  
  95.       
  96.   printf("\nRemoving IPC message queue ... ");
  97.    
  98.   if( msgctl( msqid, IPC_RMID, 0 ) == -1 )
  99.     { if( errno == EINVAL )
  100.         printf("allready removed\n", errno, strerror(errno) );
  101.       else
  102.         printf("\nError (errno %d, %s)\n", errno, strerror(errno) );
  103.      }
  104.   else
  105.     printf("succeded !\n" );
  106.    
  107. }
  108.